home *** CD-ROM | disk | FTP | other *** search
/ MacHack 1997 / MacHack 1997.toast / Hacks / Hacks ’97 / NewsTicker / source code / Internet Code / SubWooferEndPoint.cp < prev    next >
Text File  |  1997-06-27  |  6KB  |  300 lines

  1. /*------------------------------------------------------------------------------
  2. #
  3. #    NewsTicker, my Hack for 1997
  4. #
  5. #    SubWooferEndPoint.cp    -    Uses SubWoofer to read html pages in
  6. #
  7. ------------------------------------------------------------------------------*/
  8. #include <Errors.h>
  9. #include <string.h>
  10.  
  11. #include "SubWooferEndPoint.h"
  12. #include "HTMLExtractor.h"
  13.  
  14. static OSStatus MyNotifier(SubWooferEndPoint* me, URLReference urlRef, URLEvent event,
  15.         const char* changed, UInt32 downloadSize)
  16. {
  17.     me->HandleSubWoofer(event, changed);
  18.     return noErr;
  19. }
  20. //
  21. // Our constructor
  22. //
  23. SubWooferEndPoint::SubWooferEndPoint( HTMLExtractor* theHandler )
  24. {
  25.     mfDataWaiting = false;
  26.     mfDoShutdown = false;
  27.     mfBytesReceived = 0;
  28.     
  29.     mfMyHandler = theHandler;
  30.     mfTheReference = nil;
  31. }
  32. //
  33. // Our destructor
  34. //
  35. SubWooferEndPoint::~SubWooferEndPoint( void )
  36. {
  37.     HandleShutdown();
  38.     if (mfTheReference)
  39.         URLDisposeReference(mfTheReference);
  40. }
  41. //
  42. // Say we want to get the page
  43. //
  44. OSErr SubWooferEndPoint::StartGettingFile(char* address, short port, Idler* theIdler)
  45. {
  46. #ifdef USESUBWOOFER
  47.     OSErr    io;
  48.     char    newaddress[32] = "http://";
  49.     
  50.     strcat(newaddress, address);
  51.     
  52.     mfDataWaiting = false;
  53.     mfDoShutdown = false;
  54.     mfDoingHeader = false;
  55.     mfBytesReceived = 0;
  56.     
  57.     //start getting the file
  58.     if (mfTheReference)
  59.         URLDisposeReference(mfTheReference);
  60.     io = URLNewReference(newaddress, &mfTheReference);
  61.     
  62.     if (io==noErr)
  63.     {
  64.         //Start connecting to the URL
  65.         io = URLOpen(mfTheReference,nil, 0,    // openFlags,
  66.                     (URLNotifyProcPtr)MyNotifier,    // notifyProc,
  67.                     kURLAllEventsFlag, //kURLDataAvailableEventFlag+kURLErrorOccurredEventFlag+kURLCompletedEventFlag, //event flags
  68.                     (unsigned long)this);
  69.     }
  70.     
  71.     if (io!=noErr)
  72.     {
  73.         DebugStr("\pError opening");
  74.         HandleShutdown();
  75.     }
  76.     return io;
  77. #else
  78.     return -1;
  79. #endif
  80. }
  81.  
  82. OSErr SubWooferEndPoint::StartGettingHeader(char* address, short port, Idler* theIdler)
  83. {
  84. #ifdef USESUBWOOFER
  85.     OSErr    io;
  86.     char    newaddress[32] = "http://";
  87.     
  88.     strcat(newaddress, address);
  89.     
  90.     mfDataWaiting = false;
  91.     mfDoShutdown = false;
  92.     mfDoingHeader = true;
  93.     mfBytesReceived = 0;
  94.     
  95.     //start getting the file
  96.     if (mfTheReference)
  97.         URLDisposeReference(mfTheReference);
  98.     io = URLNewReference(newaddress, &mfTheReference);
  99.     
  100.     if (io==noErr)
  101.     {
  102.         //Start connecting to the URL
  103.         io = URLOpen(mfTheReference,nil, 0,    // openFlags,
  104.                     nil,    // notifyProc,
  105.                     kURLDataAvailableEventFlag+kURLErrorOccurredEventFlag+kURLCompletedEventFlag, //event flags
  106.                     (unsigned long)this);
  107.     }
  108.     
  109.     if (io!=noErr)
  110.     {
  111.         HandleShutdown();
  112.     }
  113.     return io;
  114. #else
  115.     return -1;
  116. #endif
  117. }
  118. //
  119. // Handle an event from SubWoofer
  120. //
  121. void SubWooferEndPoint::HandleSubWoofer(URLEvent event, const char* changed)
  122. {
  123. #ifdef USESUBWOOFER
  124.     switch (event)
  125.     {
  126.         case kURLDataAvailableEvent:
  127.             mfDataWaiting = true;
  128.             if (mfDoingHeader)
  129.                 mfDoShutdown = true;    //bail after we've got the header if that's all we want
  130.             break;
  131.         case kURLCompletedEvent:
  132.             mfDoShutdown = true;
  133.             break;
  134.             
  135.     }
  136. #endif
  137. }
  138. //
  139. // Handle the work of everything we have to do
  140. //
  141. void SubWooferEndPoint::DoIdle(void)
  142. {
  143. #ifdef USESUBWOOFER
  144.     OSErr    io;
  145.     char*    buffer;
  146.     Size    bufferSize;
  147.     short    index;
  148.     Boolean    GotOne;
  149.     Size     available;
  150.  
  151.     if (mfDoShutdown)
  152.     {
  153.         HandleShutdown();
  154.         mfDoShutdown = false;
  155.     }
  156.     if (mfDataWaiting)
  157.     {
  158.         mfDataWaiting = false;
  159.         
  160.         io = URLGetDataAvailable(mfTheReference, &available);
  161.         if (io!=noErr)
  162.             return;
  163.         
  164.         //read some data in
  165.         
  166.         bufferSize = sizeof(mfInComingData) - mfBytesReceived;
  167.         if (bufferSize<available)
  168.             bufferSize = available;
  169.         io = URLGetBuffer(mfTheReference, &buffer, &bufferSize);
  170.         if (io!=noErr)
  171.         {
  172.             URLReleaseBuffer(mfTheReference, buffer);
  173.             return;
  174.         }
  175.         BlockMove(buffer, &mfInComingData[mfBytesReceived], bufferSize);
  176.         URLReleaseBuffer(mfTheReference, buffer);
  177.         
  178.         mfBytesReceived += bufferSize;
  179.         available -= bufferSize;
  180.         
  181.         do    //parse out all the lines of text
  182.         {
  183.             GotOne = false;
  184.             for (index = 0; index < mfBytesReceived; index++)
  185.             {
  186.                 if (mfInComingData[index]==0x0A)    //found end of line, line feed of cr/lf
  187.                 {
  188.                     GotOne = true;
  189.                     index++;    //convert the index into the size
  190.                     if (mfMyHandler)        //have them handle it and clear it
  191.                         mfMyHandler->ReceiveString(mfInComingData, index);
  192.                     BlockMove(&mfInComingData[index], &mfInComingData[0], mfBytesReceived-index);
  193.                     mfBytesReceived-=index;
  194.                     index = 0;
  195.                 }
  196.             }
  197.             if (!GotOne)
  198.             {
  199.                 for (index = 0; index < mfBytesReceived; index++)
  200.                 {
  201.                     if (mfInComingData[index]==0x0D)    //Does this one have just returns?
  202.                     {
  203.                         GotOne = true;
  204.                         index++;    //convert the index into the size
  205.                         
  206.                         if (mfMyHandler)        //have them handle it and clear it
  207.                             mfMyHandler->ReceiveString(mfInComingData, index);
  208.                         BlockMove(&mfInComingData[index], &mfInComingData[0], mfBytesReceived-index);
  209.                         mfBytesReceived-=index;
  210.                         index = 0;
  211.                     }
  212.                 }
  213.             }
  214.             if ((!GotOne)&&(mfBytesReceived>sizeof(mfInComingData)/2))    //it's just a whole lot with no line feed
  215.             {
  216.                 if (mfMyHandler)        //have them handle it and clear it
  217.                     mfMyHandler->ReceiveString(mfInComingData, mfBytesReceived);
  218.                 mfBytesReceived = 0;
  219.             }
  220.         }
  221.         while (GotOne);
  222.         io = URLGetDataAvailable(mfTheReference, &available);
  223.         mfDataWaiting = (io == noErr) && (available>0);
  224.     }
  225. #endif
  226. }
  227.  
  228. //
  229. // Close The File
  230. //
  231. void SubWooferEndPoint::HandleShutdown(void)
  232. {
  233. #ifdef USESUBWOOFER
  234.     if (mfMyHandler)
  235.     {
  236.         mfMyHandler->Disconnect();
  237.     }
  238. #endif
  239. }
  240.  
  241. //
  242. // Get the header
  243. //
  244. OSErr SubWooferEndPoint::GetSubWoofHeader(Str31    ModDate)
  245. {
  246. #ifdef USESUBWOOFER
  247.     OSErr    io;
  248.     Str255    tempstr;
  249.     char*    cp;
  250.     Size    offset;
  251.     char*    thebuffer;    
  252.     Size    thesize;
  253.     
  254.     ModDate[0] = 0;
  255.     
  256.     if (mfMyHandler)
  257.     {
  258.         io = URLGetPropertySize(mfTheReference, kURLHTTPRespHeader, &thesize);
  259.         if (io!=noErr)
  260.             return io;
  261.         
  262.         thebuffer = NewPtrClear(thesize);
  263.         
  264.         io = URLGetProperty(mfTheReference, kURLHTTPRespHeader, thebuffer, thesize);
  265.         if (io==noErr)
  266.         {
  267.             cp = thebuffer; offset = thesize;
  268.             do
  269.             {
  270.                 if    (MyCompareStr(cp, "Last-Modified:"))
  271.                 {
  272.                     cp += 15; offset -= 15;    //skip past the last-modified
  273.                     do
  274.                     {
  275.                         ModDate[0]++;
  276.                         ModDate[ModDate[0]] = *cp;
  277.                         cp++; offset--;
  278.                     }
  279.                     while ((offset>0) && (*cp!=0x0D)&&(ModDate[0]<31));
  280.                     DisposePtr(thebuffer);
  281.                     return noErr;
  282.                 }
  283.                 
  284.                 do
  285.                 {
  286.                     cp++; offset--;
  287.                 }
  288.                 while ((offset>0)&&(*cp!=0x0A));//linefeed
  289.                 
  290.                 cp++; offset--;    //skip past the line feed
  291.             }
  292.             while (offset>0);
  293.         }
  294.         DisposePtr(thebuffer);
  295.         return io;
  296.     }
  297.     else return -1;
  298. #endif
  299. }
  300.